/**
 * 对象的处理方法
 * 1、属性的遍历
 *      Object.keys() Object.values()  Object.entries()
 *      for in
 *      Object.getOwnPropertyNames(obj)
 *      Object.getOwnPropertySymbols(obj)
 *      Reflect.ownKeys(obj)
 *
 * 2、defineProperty
 * 
 * 
 *
 */

// 1、Object.keys() Object.values()  Object.entries()
// 返回一个数组列表
var obj1 = { a: 1, b: 2 };
// console.log(Object.keys(obj1))
// console.log(Object.values(obj1))
// console.log(Object.entries(obj1))
for (let [key, value] of Object.entries(obj1)) {
  // console.log(key, value)
}

// 2、getOwnPropertyNames(obj)
// 返回属性的Key列表,包括不举枚的属性，但是不包含symbol值
var obj2 = {
    [Symbol()]: 0,
    a: 1,
    b: 2
};
var keys2 = Object.getOwnPropertyNames(obj2);
// console.log(keys2) // [ 'a', 'b' ]


// 3、getOwnPropertyNames(obj)
// 返回属性的Key列表,只返回symbol值，其它属性不返回
var obj3 = {
    [Symbol()]: 0,
    [Symbol()]: 0,
    [Symbol(31123)]: 0,
    a: 1,
    b: 2
};
var keys3 = Object.getOwnPropertySymbols(obj3);
// console.log(keys3) // [ Symbol(), Symbol(), Symbol(31123) ]

// 4、Reflect.ownKeys(obj)
// 返回自身所有的索性，不包含继承的

var obj4 = {
    [Symbol()]: 0,
    a: 1,
    b: 2
};
var keys4 = Reflect.ownKeys(obj); // [ 'a', 'b', Symbol() ]
console.log(keys4) // [ Symbol(), Symbol(), Symbol(31123) ]

// 5、defineProperty
// 定义对象属性或者修改原有的属性
// 往往通过其set和get属性就行数据劫持



// super
// 改变对象里的方法this指向

